tipo(Tipo) --> 
	[ent],
	restoTipo([_L,ent,4,_O,vacio],Tipo).
tipo(Tipo) --> 
	[real],
	restoTipo([_L,real,4,_O,vacio],Tipo).
tipo(Tipo) -->
	[registro],['{'],
	campos(tabla(0,[]),TipoDatos,Tam),
	['}'],
	restoTipo([_L,registro,Tam,_O,TipoDatos],Tipo).

restoTipo(TipoDatos,Tipo) -->
	[^],
	restoTipo([_L,puntero,4,_O,TipoDatos],Tipo).

restoTipo([TDL,TDtok,TDtam,TDoff,TDtd],Tipo) -->
	['['],[N],[']'],
	{integer(N),Tam is N * TDtam},
	restoTipo([_L,array,Tam,_O,[TDL,TDtok,TDtam,TDoff,TDtd]],Tipo).

restoTipo(Tipo,Tipo) --> [].

campos(Tablah,Tabla,Tam) -->
	campo(Tablah,Tabla1,CTam),
	campos(Tabla1,Tabla,CsTam),
	{Tam is CTam + CsTam}.

campos(Tablah,Tabla,CTam) -->
	campo(Tablah, Tabla, CTam).

campo(Tablah,Tabla,CTam) -->
	tipo([_L,CToken,CTam,_Offset,CTipoDatos]),identificador(CLex),[';'],
	{anadeSimbolo(Tablah,Tabla,CLex,CToken,CTam,CTipoDatos)}.

